package com.shiguiwu.springmybatis.leetcode;

import lombok.extern.slf4j.Slf4j;

/**
 * @description: 四点坐标构成三角形
 * 两点间的距离公式 S=√(〈x2-x1)^2+(y2-y1)^2)。
 * @author: stone
 * @date: Created by 2022/7/29 23:14
 * @version: 1.0.0
 * @pakeage: com.shiguiwu.springmybatis.leetcode
 *
 *
 * 给定2D空间中四个点的坐标 p1, p2, p3 和 p4，如果这四个点构成一个正方形，则返回 true 。
 *
 * 点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
 *
 * 一个 有效的正方形 有四条等边和四个等角(90度角)。
 *

 */
@Slf4j
public class ValidSquare {

    public static void main(String[] args) {
        int[] p1 = {0, 0}, p2 = {1, 1}, p3 = {1, 0}, p4 = {0, 1};
        boolean b = validSquare(p1, p2, p3, p4);
        log.info("boolean ===> {}", b);
    }

    public static boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {

        return isRightTriangle(p1,p2,p3) && isRightTriangle(p1,p2,p4) &isRightTriangle(p2,p3,p4)
                && isRightTriangle(p1,p3,p4);
    }

    /**
     * 任意三点是否是直角三角形
     * @param p1 1
     * @param p2 2
     * @param p3 3
     * @return boolean
     */
    private static boolean isRightTriangle(int[] p1, int[] p2, int[] p3) {
        //计算两两的距离
        int s1 = distance(p1, p2);
        int s2 = distance(p1, p3);
        int s3 = distance(p2, p3);

        //判断重合的情况
        if (s1 == 0 || s2 == 0 || s3 == 0) {
            return false;
        }

        //判断勾股定理和直角三角形
        return (s1 + s2 == s3 || s1 + s3 == s2 || s2 + s3 == s1)
                && (s1 == s2 || s1 == s3 || s2 == s3);
    }

    //两点距离,数学上实际有根号的
    private static int distance(int[] p1, int[] p2) {
        return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
    }




}
